home *** CD-ROM | disk | FTP | other *** search
- #! /bin/sh
- # $Header: /home/jerry/.bin/RCS/showmult,v 1.3 92/08/10 11:39:56 jerry mh_contrib $
- ### showmult - show multiple MH messages; pass as separate files to pager
- ### Usage (in MH profile): mhl: -moreproc showmult
- ##
- ## showmult FIXES AN IRRITATING MH show PROBLEM: BY DEFAULT, MH WITH mhl
- ## READS ALL THE MESSAGE FILES YOU WANT TO SEE AT ONCE AND PIPES THEM ALL
- ## TO YOUR PAGER (LIKE more). SO, YOU CAN'T ASK THE PAGER TO JUMP BACK
- ## AND FORTH WITHIN OR BETWEEN THE MESSAGES.
- ##
- ## showmult WORKS AROUND THIS BY FEEDING THE INDIVIDUAL FILES FROM THE
- ## mhl OUTPUT TO csplit -- SPLITTING THEM INTO SEPARATE FILES, THEN GIVING
- ## THE INDIVIDUAL FILES TO THE PAGER.
- ##
- # ASSUMES THAT YOU'RE USING AN mhl FORMAT FILE THAT PUTS
- # >>> foldername:msgnum
- # AT THE START OF EVERY MESSAGE.
- #
- # NOTE TO HACKERS: TABSTOPS SET AT 4 IN THIS CODE
- #
- # USE AT YOUR OWN RISK. SEEMS TO WORK, BUT IT'S YOUR RESPONSIBILITY!
- # PLEASE TELL ME ABOUT BUGS AND FIXES: Jerry Peek, jerry@ora.com
-
- pager=${PAGER-less} # PROGRAM FOR PAGING THRU MESSAGES (DEFAULT IS "less")
- # START SEPARATOR LINE LIKE THE ONE mhl SHOULD OUTPUT ($mhfolder IS FOLDER NAME)
- sep=">>> ${mhfolder?}:"
- # SET PREFIX (LIKE msg12345-01, msg12345-02) FOR FILES csplit MAKES IN /tmp:
- msgs=msg$$-
- temp=/tmp/SHOWMULT$$
- umask 077 # MAKE ALL TEMP FILES PRIVATE
- trap 'rm -f $temp ${msgs}*; exit' 0 1 2 15
-
- cat > $temp # READ TEXT FROM mhl ON OUR STANDARD INPUT
-
- # NUMBER OF SEPARATORS IN THE FILE = NUMBER OF MESSAGES.
- numseps="`egrep -c \"^$sep\" $temp`"
- case $? in
- 2) echo "`basename $0` quitting: egrep bombed." 1>&2
- exit
- ;;
- esac
-
- case "$numseps" in
- 0) $pager $temp ;; # NO SEPARATOR IF LESS THAN 2 MESSAGES
- 1) # ONE SEPARATOR??? SHOW MESSAGE(S), THEN COMPLAIN:
- $pager $temp
- echo "`basename $0`: warning: wild message separator? Couldn't split that." 1>&2
- ;;
- [2-9]|[1-9][0-9])
- # BETWEEN 2 AND 99 MESSAGES. SHOW THEM.
- # FIRST, GET REPETITION NUMBER FOR csplit:
- repeats="`expr $numseps - 1`"
- cd /tmp
- # IF $sep HAS A "/" IN IT, ADD BACKSLASH(ES) TO KEEP csplit FROM PUKING:
- case "$sep" in
- */*) sep="`echo \"$sep\" | sed 's@/@\\\\/@g'`" ;;
- esac
- if csplit -s -f $msgs $temp "/^$sep/" "{$repeats}"
- then
- rm -f ${msgs}00 # FIRST FILE IS ALWAYS EMPTY, SIGH
- $pager ${msgs}*
- else
- echo "`basename $0`: quitting: problem with 'csplit'?" 1>&2
- fi
- ;;
- [1-9]*)
- # csplit CAN'T HANDLE MORE THAN 100 MESSAGES AND WE CAN'T DO MORE THAN 99:
- echo "`basename $0`: sorry, can't handle more than 99 messages." 1>&2
- ;;
- *) echo 1>&2 "`basename $0`: quitting: wild 'egrep -c' output?:
- $numseps"
- ;;
- esac
-
- exit # SHOULD REALLY SET A STATUS, I GUESS
-